package com.bone.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.net.UnknownHostException;

/**
  *
  * @author : WangKeKe
  * @date : 2020/8/14 9:10
  * Description : 配置Redis的序列化与反序列
  *
*/

@Configuration
public class RedisConfig {

   @Bean("myRedisTemplate")
   @SuppressWarnings("all")
   public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
           throws UnknownHostException {
       // 一般直接使用String，Object类型
       RedisTemplate<String,Object> template = new RedisTemplate<>();
       template.setConnectionFactory(redisConnectionFactory);

       // 序列化配置
       Jackson2JsonRedisSerializer objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
       // 转义
       ObjectMapper objectMapper = new ObjectMapper();
       objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
       objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
       objectJackson2JsonRedisSerializer.setObjectMapper(objectMapper);
       // String 的序列化
       StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

       // key采用String的序列化方式
       template.setKeySerializer(stringRedisSerializer);
       // hash的key也采用String的序列化方式
       template.setHashKeySerializer(stringRedisSerializer);
       // value序列化方式采用Jackson
       template.setValueSerializer(objectJackson2JsonRedisSerializer);
       // hash的value序列化方式采用Jackson
       template.setHashKeySerializer(objectJackson2JsonRedisSerializer);

       template.afterPropertiesSet();

       return template;
   }

}
